Genéricos y tipos anulables.
Algunas de las características de C# 7 ya no las encuentras por defecto en C# 8. Sin embargo, hay formas de seguir utilizando algunas de ellas. Como parte de nuestro curso de C# te mencionamos algunas de ellas.
Si realizas una gran cantidad de trabajo con los genéricos, puedes encontrarte con un problema de tipos anulables. A continuación analizamos un caso específico y su solución. Considera este código:
public delegate void ValueChanged<in T>(T oldValue, T newValue);
El diseño previsto para este delegate es que oldValue y newValue sean anulables. Entonces, podrías pensar que basta con agregar un par de signos de interrogación y seguir adelante. Sin embargo, al hacerlo, devuelve este mensaje de error:
> Error CS8627 A nullable type parameter must be known to be a value type or non-nullable reference type. Consider adding a 'class', 'struct', or type constraint.
Si necesita admitir tanto tipos de valor como de referencia, no hay una manera fácil de solucionarlo. Como no se puede expresar un "o" en la restricción de tipo, necesita un delegado para las clases y otro para las estructuras.
public delegate void ValueChanged<in T>(T? oldValue, T? newValue) where T : class; public delegate void ValueChanged<T>(T? oldValue, T? newValue) where T : struct;
Sin embargo, esto no funciona porque ambos delegados tienen el mismo nombre. Podrías darles nombres distintos, pero luego tendrías que duplicar todo el código que los usa.
Afortunadamente, C# tiene un valor de escape. Con la directiva #nullable, puedes volver a la semántica de C# 7 y el código continuará funcionando según lo previsto.
#nullable disable public delegate void ValueChanged<in T>(T oldValue, T newValue); #nullable enable
Esta solución no está libre de defectos. Deshabilitar la característica de referencias anulables es todo o nada; no podrías usarlo para hacer oldValuenullable y newValuenon-nullable.
Esta es una forma posible de usar este código. Para poder usar mejor la plataforma de .NET te sugerimos que también tomes un curso de Visual Basic con el fin de dominar la programación. También puedes ampliarlo con el uso de una base de datos de SQL y tomar un curso de MySQL.